#include"BlockQueue.hpp"
#include"Task.hpp"//任务队列结构体

void* consumer(void* args)//消费者方法
{
    cp_blockqueue<CountTask<int>>* cp = (cp_blockqueue<CountTask<int>>*)args;
    int data = 0;//消费数据
    while(true)
    {
        CountTask<int> t;
        cp->pop(&t);
        t.Run();//调用内部函数进行处理数据
        //sleep(1);
    }

}
void* producter(void* args)//生产者方法
{
    cp_blockqueue<CountTask<int>>* cp = (cp_blockqueue<CountTask<int>>*)args;
    const char* table = "+-*/%";
    while(true)
    {
        int x = rand()%20 + 1; //生产数据    x
        int y = rand()%10 + 1; //生产数据    y 
        char ch = table[rand()%4];
        CountTask<int> t(x,y,ch);
        cout<<"我是生产者，我派发了一个任务：" << x << ch << y << "= ?" << endl;
        cp->push(t);
        sleep(1);
    }

}


int main()
{
    srand((long long)time(nullptr));
    cp_blockqueue<CountTask<int>>* cp = new cp_blockqueue<CountTask<int>>();

    pthread_t c1,p; 
    //修改成多生产者
    pthread_t c2;
    pthread_t c3;
    pthread_t c4;
    pthread_create(&c1, nullptr, consumer, (void*)cp);//消费者
    pthread_create(&c2, nullptr, consumer, (void*)cp);//消费者
    pthread_create(&c3, nullptr, consumer, (void*)cp);//消费者
    pthread_create(&c4, nullptr, consumer, (void*)cp);//消费者
    pthread_create(&p, nullptr, producter, (void*)cp);//生产者

    pthread_join(c1, nullptr);
    pthread_join(c2, nullptr);
    pthread_join(c3, nullptr);
    pthread_join(c4, nullptr);
    pthread_join(p, nullptr);

    return 0;
}
